git submoduleとsubtreeの違い
submodule
リポジトリB内の特定のリビジョンを指す
.git/config及び.gitmodulesに記載される
リポジトリBの変更に追従せず
コミットはこんな感じになる
code:txt
$ git status
On branch general-processor
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: ../.gitmodules
new file: bert-japanese
code:diff
$ git diff --staged
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..d6230a5
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+ path = toro/bert-japanese
diff --git a/toro/bert-japanese b/toro/bert-japanese
new file mode 160000
index 0000000..1f049a9
--- /dev/null
+++ b/toro/bert-japanese
@@ -0,0 +1 @@
+Subproject commit 1f049a9e69e6aa62d37ac3c51d82f9697fb2f393
この表示によると。gitにとってリポジトリBは特殊なファイル扱い
内容はSubproject commit 1f049a9e69e6aa62d37ac3c51d82f9697fb2f393
git側が必要に応じてsubmoduleをリビジョンに基づいてファイルを展開してくれるだけ
subtree
リポジトリBをそのままorphanな感じで取り込んで、mergeする
squashしてmergeすることも可能
.git/configには記載されない
なぜかrepoのルートじゃないとできないが、prefixで深い階層にも入れられる
いかの要件があるとsubtreeがいい
リポジトリBに独自修正を入れたい
さらにその修正をリポジトリBにpushする場合もある
その場合は、リポジトリBをremoteに追加して、リポジトリBに対する変更のコミットをそのorphan側のやつにはやしてpushすればいいはず
以上をまとめると、リポジトリ内で別リポジトリをcloneしているようなものと思えばいい
ただしこれはgithubにおいてはforkという機能が解決してくれることが多い
リポジトリBをforkして必要な変更を加えて、
それをsubmoduleとしていれるか
この場合はsubtreeの操作方法考えないで、ただ単にsubmoduleでリビジョンを上げてけばいいのでラクかも
subtreeとして入れても良さそう